#!/bin/bash
# 获取脚本所在目录
DIRNAME=$(cd "$(dirname "$0")"; pwd)

# 定义工作空间路径（项目根目录）
# 原理：取脚本目录的上级目录，兼容软链接场景
WORKSPACE=$(dirname "$DIRNAME")
[ -z "$WORKSPACE" ] && echo "错误: 工作空间路径解析失败" && exit 1

# 检查依赖工具
check_dependencies() {
  local missing=()
  ! command -v jq &> /dev/null && missing+=("jq")
  ! command -v java &> /dev/null && missing+=("Java")

  if [ ${#missing[@]} -gt 0 ]; then
    echo "缺失依赖: ${missing[*]}"
    echo "请先安装jq工具: brew install jq (macOS) 或 apt-get install jq (Linux)"
    exit 1
  fi
}

# 解析Gradle配置获取签名信息
extract_gradle_property() {
  grep "$1" "$GRADLE_CONFIG" | awk -F '=' '{print $2}' | tr -d " ';\""
}

read_config() {
  # 参数校验段
  if [ $# -lt 2 ]; then
    echo "Usage: $0 <channel> <apkPath>"
    exit 1
  fi
  CHANNEL="$1"
  TARGET_APK="$2"

  # 环境检测段
  [ -z "$ANDROID_HOME" ] && echo "ERROR: ANDROID_HOME not set" && exit 1
  [ -z "$WORKSPACE" ] && echo "ERROR: WORKSPACE not set" && exit 1

  # 工具路径配置
  BUILD_TOOLS="$ANDROID_HOME/build-tools/30.0.2"

 # 配置文件检测
  GRADLE_CONFIG="$WORKSPACE/android/buildsystem/global_config.gradle"
  [ ! -f "$GRADLE_CONFIG" ] && echo "ERROR: Missing gradle config" && exit 1

  # 关键修正点：标准化Android项目路径
  ANDROID_PROJECT_DIR="$WORKSPACE/android"

  # 签名信息解析（优化路径处理）
  RAW_KEYSTORE_PATH=$(extract_gradle_property "RELEASE_STORE_FILE")

  # 跨平台路径解析方案（新版）
  if [[ "$RAW_KEYSTORE_PATH" =~ ^\.\./.* ]]; then
    # 处理../开头的相对路径（确保保留android目录）
    KEYSTORE_PATH="${ANDROID_PROJECT_DIR}/${RAW_KEYSTORE_PATH#../}"
  elif [[ "$RAW_KEYSTORE_PATH" =~ ^/.* ]]; then
    # 处理绝对路径（原样保留）
    KEYSTORE_PATH="$RAW_KEYSTORE_PATH"
  else
    # 处理普通相对路径（自动添加android目录）
    KEYSTORE_PATH="${ANDROID_PROJECT_DIR}/${RAW_KEYSTORE_PATH}"
  fi

  # 路径标准化后处理
  # if command -v realpath &> /dev/null; then
  #  KEYSTORE_PATH=$(realpath -m "$KEYSTORE_PATH")
  # fi

  # 参数提取与验证
  KEY_ALIAS=$(extract_gradle_property "RELEASE_KEY_ALIAS")
  KEYSTORE_PASS=$(extract_gradle_property "RELEASE_STORE_PASSWORD")
  [ ! -f "$KEYSTORE_PATH" ] && echo "ERROR: Keystore not found: $KEYSTORE_PATH" && exit 1
  [ -z "$KEY_ALIAS" ] && echo "ERROR: Empty key alias" && exit 1
  [ -z "$KEYSTORE_PASS" ] && echo "ERROR: Empty keystore password" && exit 1

  # Windows子系统兼容处理
  if [[ "$OSTYPE" == "msys" ]]; then
    BUILD_TOOLS=$(cygpath -u "$BUILD_TOOLS")
    TARGET_APK=$(cygpath -u "$TARGET_APK")
    KEYSTORE_PATH=$(cygpath -u "$KEYSTORE_PATH")
  fi
}


# 主流程
main() {
  check_dependencies
  read_config "$@"  # 传递所有命令行参数

  # 提取APK名称
  TARGET_APK_NAME=$(basename "$TARGET_APK" .apk)
  OUT_DIR="${DIRNAME}/output"
  mkdir -p "$OUT_DIR"

  echo "=============== 配置信息 ================"
  echo "构建工具: $BUILD_TOOLS"
  echo "目标APK: $TARGET_APK"
  echo "渠道   : $CHANNEL"
  echo "输出目录: $OUT_DIR"
  echo "密钥库  : $KEYSTORE_PATH"
  echo "密钥别名: $KEY_ALIAS"
  echo "========================================"

  # zipalign处理
  echo "=============== zipalign处理 ============="
  "${BUILD_TOOLS}/zipalign" -v -p 4 "$TARGET_APK" "${TARGET_APK_NAME}-aligned.apk"

  # apksigner签名（兼容Windows/macOS/Linux）
  echo "=============== apksigner签名 ============"
  APKSIGNER_CMD="apksigner"
  if [[ "$OSTYPE" == "msys" ]]; then
    APKSIGNER_CMD="apksigner.bat"
  fi

  "${BUILD_TOOLS}/${APKSIGNER_CMD}" sign \
    --v1-signing-enabled true \
    --v2-signing-enabled true \
    --ks "$KEYSTORE_PATH" \
    --ks-key-alias "$KEY_ALIAS" \
    --ks-pass "pass:$KEYSTORE_PASS" \
    --key-pass "pass:$KEYSTORE_PASS" \
    --out "${TARGET_APK_NAME}-signed.apk" \
    "${TARGET_APK_NAME}-aligned.apk"
  sleep 3  # 确保签名完成

  # VasDolly渠道写入
  echo "=============== VasDolly渠道写入 ========="
  OUT_DIR="${OUT_DIR%/}"  # 移除尾部斜杠
  java -jar "${DIRNAME}/VasDolly.jar" put -c "$CHANNEL" \
    "${TARGET_APK_NAME}-signed.apk" "${OUT_DIR}"

  # 清理临时文件
  echo "=============== 清理临时文件 ============="
  rm -f "${TARGET_APK_NAME}-aligned.apk" "${TARGET_APK_NAME}-signed.apk" *.idsig

  echo "=============== 处理完成 ================="
  echo "已签名并打包渠道的APK保存在: ${OUT_DIR}/"
}

main "$@"  # 执行主函数并传递所有参数